package com.lc.yygh.hosp.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lc.yygh.common.result.Result;
import com.lc.yygh.common.utils.MD5;
import com.lc.yygh.hosp.mapper.HospitalSetMapper;
import com.lc.yygh.hosp.service.HospitalSetService;
import com.lc.yygh.model.hosp.HospitalSet;
import com.lc.yygh.vo.hosp.HospitalSetQueryVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.util.StreamUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Random;
@Api(tags = "医院设置管理")//这个注解作用只是为了让swagger这个后台页面有点中文，看着更清晰，跟代码逻辑没一点关系
@RestController
@RequestMapping("/admin/hosp/hospitalSet")
//@CrossOrigin  用了GetWay来解决跨域问题就不能用这个注解了，会冲突
public class HospitalSetController {

    @Autowired
    private HospitalSetService hospitalSetService;//只有在注入mapper的时候才会有下波浪线问题，加@Repository注解即可，这里不用加


    //1.获取医院设置列表
    /*findAll和deleteById方法一个返回集合，一个返回布尔值，还有其他类型，尤其是在团队开发中，每个人习惯不一样，比如对于布尔值，有人就返回1或0，
    这样对于整个项目的开发很不友好，所以我们想让返回值是一种类型，所以我们定义了一个result结果类，这样也更方便在前端展示我们把集合或布尔值这些数据封装
    到Result中再返回这个result结果类*/
    /*@GetMapping("/findAll")
    public List<HospitalSet> findAll(){
        List<HospitalSet> list = hospitalSetService.list();
        return list;
    }*/
    @GetMapping("/findAll")
    @ApiOperation(value = "获取医院设置列表")//这个注解作用只是为了让swagger这个后台页面有点中文，看着更清晰，跟代码逻辑没一点关系
    public Result findAll(){
        List<HospitalSet> list = hospitalSetService.list();
        //把所有用到的数据封装到Result对象里
        return Result.success(list);//我们在Result里写的带参的success的参数类型是Object，所以不管是什么类型的数据都能封装进去
    }

    //2.逻辑删除医院设置(逻辑删除之后，虽然还在数据库中，但是如果调修改这条数据的接口已经找不到这条数据了，你能看到，但是已经用不了了)
    /*@DeleteMapping("/{id}")//DeleteMapping发送的是delete请求，不能用浏览器测试
    public boolean deleteById(@PathVariable Long id){//当路径上的参数名和函数的形参名一致时，@PathVariable注解不用指定属性
        boolean b = hospitalSetService.removeById(id);
        return b;
    }*/
    @DeleteMapping("/{id}")//DeleteMapping发送的是delete请求，不能用浏览器测试
    @ApiOperation(value = "逻辑删除医院设置")
    //@ApiParam写不写都可以 这里只是演示一下关于swagger的注解
    public Result deleteById(@ApiParam(name = "id",value = "医院的编号") @PathVariable Long id){//当路径上的参数名和函数的形参名一致时，@PathVariable注解不用指定属性
        boolean b = hospitalSetService.removeById(id);
        if (b){
            return Result.success();//success方法可以带参数也可以不带参数，这里删除不需要数据
        }
        return Result.fail();//Result的写法类似工具类，直接用类名点即可
    }
    //3.条件查询带分页
    /*这里写的时候出现根据名字模糊查询的时候怎么也查不到，但是根据编号就能查到的问题，我找了一下午，我试着把数据库名字字段改成英文看了一下果然好了，我就想到yml里配置的问题了
    千万不要忘了，数据库配置的url后边要加useUnicode=true&characterEncoding=UTF8&useSSL=false*/
    @PostMapping("/findPageHospSet/{current}/{limit}") //使用到RequestBody，必须是post请求,也可以用PutMapping
    @ApiOperation(value = "条件查询带分页")
    public Result findPageHospSet(@PathVariable long current,
                                  @PathVariable long limit,
                                  @RequestBody(required = false) HospitalSetQueryVo hospitalSetQueryVo) {
        /*RequestBody注解的主要作用就是用于接收前端的参数并转换成一个实体对象，必须是post请求*/
        /*HospitalSetQueryVo类(自定义的)是用来封装从前端传过来的数据的*/
        Page<HospitalSet> page=new Page<>(current,limit);//Page是mybatis-plus的分页插件，pagehelper是mybatis的
        //条件构造器
        QueryWrapper<HospitalSet> wrapper=new QueryWrapper<>();
        //封装由前端传到RequestBody里的参数
        String hoscode=hospitalSetQueryVo.getHoscode();
        String hosname = hospitalSetQueryVo.getHosname();
        if (!StringUtils.isEmpty(hosname)){
            wrapper.like("hosname",hosname);//名字模糊查询用like
        }
        if (!StringUtils.isEmpty(hoscode)){//也可以用! =null ,这里用了一个方法
            wrapper.eq("hoscode",hoscode);//第一个参数是数据库字段
        }

        Page<HospitalSet> pageHospitalSet = hospitalSetService.page(page, wrapper);//page方法是IService的所以想用Page来分页就要用到IService
        /*Page实现了IPage，本质上IPage才是mybatis-plus的分页插件 前边用IPage类接收也可以*/
        return Result.success(pageHospitalSet);
    }
    //4.添加医院设置
    @PostMapping("/saveHospitalSet")
    @ApiOperation(value = "添加医院设置")
    public Result saveHospitalSet(@RequestBody HospitalSet hospitalSet) {//把前端传过来的数据封装到HospitalSet对象，并把对象添加到数据库
        //设置医院状态  1正常使用  0不能使用
        hospitalSet.setStatus(1);
        Random random = new Random();
        //获取一个随机字符串
        String src=System.currentTimeMillis()+""+ random.nextInt(1000);
        //获取加密字符串
        String encrypt = MD5.encrypt(src);//这个MD5类和方法是我们自己写的，在service-utils模块中
        //设置签名秘钥
        hospitalSet.setSignKey(encrypt);//因为signKey这个属性不是我们添加医院的时候自己设置的，所以在这里生成一个，并封装到对象里，这样才能加到数据库中，否则会报这个字段没有默认值的错误
        //调用service完成添加
        boolean save = hospitalSetService.save(hospitalSet);
        if (save){
            return Result.success();
        }
        return Result.fail();
    }
    //5.根据id获取医院设置
    @ApiOperation(value = "根据id获取医院设置")
    @GetMapping("/getHospSet/{id}")
    public Result getHostSet(@PathVariable Long id){
        HospitalSet hospSet = hospitalSetService.getById(id);
        return Result.success(hospSet);
    }

    //6.修改医院设置
    @PutMapping("/updateHospitalSet")
    @ApiOperation("修改医院设置")
    public Result updateHospitalSet(@RequestBody HospitalSet hospitalSet){
        boolean b = hospitalSetService.updateById(hospitalSet);//好简单，有空看下原理
        if (b){
            return Result.success();
        }
        return Result.fail();
    }
    //7.批量删除
    @DeleteMapping("/batchRemove")
    @ApiOperation("批量删除")//当只有value属性的时候，可以不写value
    public Result batchRemoveHospitalSet(@RequestBody List<Long> idList) {
        hospitalSetService.removeByIds(idList);
        return Result.success();
    }

    //8.医院锁定及解锁
    @PutMapping("/lockHospitalSet/{id}/{status}")
    @ApiOperation("医院锁定与解锁")
    public Result lockHospSet(@PathVariable Long id,@PathVariable Integer status){
        HospitalSet hospSet = hospitalSetService.getById(id);
        //修改状态值(你在前端通过勾选或不勾选什么的就可以改变status值然后传过来进而修改数据库的status)
        hospSet.setStatus(status);
        hospitalSetService.updateById(hospSet);//参数是对象
        return Result.success();

    }

    //9.发送签名key
    @ApiOperation(value = "发送签名key")
    @PutMapping("/sendKey/{id}")
    public Result lockHospitalSet(@PathVariable Long id){
        HospitalSet byId = hospitalSetService.getById(id);
        String signKey = byId.getSignKey();
        String hoscode = byId.getHoscode();
        //发送短信（未完成，代办事项）
        return Result.success();
    }
    /*知识点：添加和修改操作的参数都是实体类，不同点是添加时候的实体是没有id的，通常用主键策略自动生成id，修改的时候的实体类是有id的，根据id找到对应实体*/
    /*知识点：RequestBody的作用是将前端传来的json格式的数据转为自己定义好的javabean对象，需要注意的是前端传入数据的属性名称要和后端javabean中定义的一致*/
    /*知识点： @PathVariable  @RequestParam  @RequestBody三个注解都是作用于方法的参数，@PathVariable的使用是restful风格，比较简单
    *@RequestParam和@RequestBody的作用其实差不多，都是把前端数据传到后端，且前端参数名必须和后端参数名要保持一致，否则报错 ，不同点是@RequestParam
    * 传的是单个参数，@RequestBody是把所有前端要传的数据封装成指定的对象实例(前端所有参数名要和这个对象类的属性一一对应)*/

}
